#include <stdio.h>
#include <string.h>
#include <assert.h>
// memcpy 只要处理不重叠的内存拷贝就可以了。当内存发生局部重叠的时候,memcpy不保证拷贝的结果的正确。
// memmove 处理重叠内存的拷贝

// 函数memcpy从source的位置开始向后复制num个字节的数据到dest的内存位置
// 这个函数在遇到\0的时候不会停下来
// 如果source和dest有任何的重叠，复制的结果都是未定义的

void *my_memcpy(void *dest, const void *src, size_t num){
    assert(dest && src);
    void *ret = dest;
    while(num--){
        *(char *)dest = *(char *)src ;
        (char *)dest ++;
        (char *)src ++;
    }
    return dest;
}

struct S {
    char name[10];
    int age;
};
int main()
{
    int p1[] = {1,2,3,4,5};
    int p2[] = { 0 };
    // memcpy(p2,p1,sizeof(p1));
    my_memcpy(p2, p1, sizeof(p1));

    for (int i = 0; i < 5; i++)
    {
        printf("%d ", p2[i]);
    }
    printf("\n");

    struct S arr[] = {{"zhangsan",15},{"lisi",20}};
    struct S arr1[] = {};
    // memcpy(arr1, arr, sizeof(arr));
    my_memcpy(arr1, arr, sizeof(arr));
    printf("%s = %d \n", arr1[0].name, arr1[0].age);
    printf("%s = %d \n", arr1[1].name, arr1[1].age);

    int arr2[] = {1,2,3,4,5,6,7,8,9,10};
    int *pp = arr2;
    my_memcpy(pp + 2, arr2, 5); // 这样copy有问题，使用memmove处理内存重叠的问题
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", pp[i]);
    }
    printf("\n");

    int arr3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    // 需求：把1 2 3 4 5 放到 3 4 5 6 7的位置，变成 1 2 1 2 3 4 5 8 9 10
    memmove(arr3 + 2, arr3, 5); // 这样copy有问题，使用memmove处理内存重叠的问题
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr3[i]);
    }

    return 0; // 返回 0
}
